home *** CD-ROM | disk | FTP | other *** search
- #include <tile$lib>.structures
- #include <tile$lib>.blocks
-
- memory locals string blocks structures queues definitions
-
- struct.type QUEUE ( -- )
- ptr +succ ( queue -- addr) private
- ptr +pred ( queue -- addr) private
- ptr +name
- long +id
- struct.init ( queue -- )
- dup over +succ ! dup +pred !
- struct.end
-
- : succ ( queue -- succ)
- +succ @
- ;
-
- : pred ( queue -- pred)
- +pred @
- ;
-
- : size-queue ( queue -- num)
- 0 swap dup >r ( Save pointer to queue header)
- begin
- swap 1+ swap +succ @ ( Increment size and step to next)
- dup r@ = ( Is this the last element?)
- until
- r> 2drop ( Drop parameters and return size)
- ;
-
- : map-queue ( queue block[item -- ] -- )
- over >r ( Save pointer to queue header)
- begin
- over +succ @ >r ( Save pointer to next item)
- dup >r ( Save block on return stack)
- call ( Call the block with the item)
- 2r> tuck ( Restore the parameters)
- r@ = ( Check if end of queue)
- until
- r> drop 2drop ( Drop all temporary parameters)
- ;
-
- : ?map-queue ( queue block[item -- bool] -- )
- over >r ( Save pointer to queue header)
- begin
- over +succ @ >r ( Save pointer to next item)
- dup >r ( Save block on return stack)
- call ( Call the block with the item)
- if 2r> true ( Exit the iteration)
- else
- 2r> tuck ( Restore the parameters)
- r@ = ( Check if end of queue)
- then
- until
- r> drop 2drop ( Drop all temporary parameters)
- ;
-
- : ?member-queue ( element queue -- bool)
- dup >r ( Save pointer to queue header)
- begin
- 2dup = ( Is this the element?)
- if 2drop r> drop true exit then ( Well drop the parameters and return)
- +succ @ dup r@ = ( Step to the next. Last element?)
- until
- r> drop 2drop false
- ;
-
- : print-entry ( queue -- )
- dup +name @ $print space +id @ . ;
-
- : print-queue ( queue -- )
- block[ print-entry cr ]; map-queue
- ;
-
- variable queue.head
-
- : add-id { name id | queue -- }
- 16 malloc -> queue
- queue as QUEUE initiate
- name queue +name !
- id queue +id !
- queue.head @
- if
- queue queue.head @ enqueue
- else
- queue queue.head !
- then
- ;
-
- : locate-id { id | p queue -- q }
- nil -> queue
- queue.head @
- if
- queue.head @ dup -> p
- size-queue 0
- do
- p +id @ id =
- if
- p -> queue leave
- else
- p succ -> p
- then
- loop
- then
- queue
- ;
-
- : remove-entry ( queue -- )
- dup dequeue free
- ;
-
- : setup-head
- nil queue.head !
- ;
-
- forth only
-
- string queues
-
- setup-head
-
- .( Add some initial entries...) cr
-
- " Peter" 1 add-id
- " Derek" 2 add-id
- " Tom" 3 add-id
-
- .( Print out entries...) cr
-
- queue.head @ print-queue
-
- .( Locate some entries...) cr
-
- 3 locate-id print-entry cr
- 1 locate-id print-entry cr
-
- .( Bump off one entry...) cr
-
- 1 locate-id remove-entry
-
- queue.head @ print-queue
-
- bye
-